﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Text.RegularExpressions;

namespace Turtle
{
    /// <summary>
    /// Lógica de interacció tortuga.
    /// </summary>
    public partial class Window1 : Window
    {
        public int AngleDireccio;

        public Window1()
        {
            InitializeComponent();
            AngleDireccio = 0;
        }

        private void txtCommand_KeyDown(object sender, KeyEventArgs e)
        {
            string com = "";

            if (e.Key == Key.Enter)
            {
                com = this.txtCommand.Text;
                this.txtCommand.Clear();

                analitzarExpressio(com);
            }    
        }

        private void analitzarExpressio(String com)
        {
            String regAdOnlyNumber = "[0-9]+";
            String regAd = "ad\\s[0-9]+";
            if (System.Text.RegularExpressions.Regex.IsMatch(com, "^" + regAd))
            {
                Match m = Regex.Match(com, regAdOnlyNumber);
                int recorregut = int.Parse(m.Groups[0].Value);
                this.AvancarTortuga(recorregut);
            }

            String regIz = "iz\\s[0-9]+";
            if (Regex.IsMatch(com, "^" + regIz))
            {
                Match m = Regex.Match(com, regAdOnlyNumber);
                int graus = int.Parse(m.Groups[0].Value);
                this.AngleEsquerre(graus);
            }

            String regDe = "de\\s[0-9]+";
            if (Regex.IsMatch(com, "^" + regDe))
            {
                Match m = Regex.Match(com, regAdOnlyNumber);
                int graus = int.Parse(m.Groups[0].Value);
                this.AngleDret(graus);
            }
            
            String regRep = "rep\\s.+";
            String regAllWithoutRep = @"ad\s[0-9]+|iz\s[0-9]+|de\s[0-9]+";
            if (Regex.IsMatch(com, regRep))
            {
                //Eliminar la posició que no ens interessa.
                MatchCollection m = Regex.Matches(com, regAllWithoutRep);
                Console.WriteLine("Debug toca rep:" + m.Captures.Count + ":" + regAllWithoutRep);
                for (int i = 0; i < m.Count; i++)
                    Console.WriteLine("Grup: " + i + ", " + m[i].Groups[0].ToString());

            }

        }

        private void AvancarTortuga(int recorregut)
        {
            //Obtenir el sinus i el cosinus de l'angle 
            //per determinar la nova direcció.
            double left= myTurtle.Margin.Left;
            double top= myTurtle.Margin.Top;
            double sin=0, cos=0;
            sin = Math.Abs(Math.Sin(AngleDireccio * Math.PI / 180));
            cos = Math.Abs(Math.Cos(AngleDireccio * Math.PI / 180));
            //Primer quadrant.
            if (AngleDireccio >= 0 && AngleDireccio <= 90)
            {
                left = left + cos * recorregut;
                top = top - sin * recorregut;
            }
            if (AngleDireccio > 90 && AngleDireccio <= 180)
            {
                left = left - cos * recorregut;
                top = top - sin * recorregut;
            }
            if (AngleDireccio > 180 && AngleDireccio <= 270)
            {
                left = left - cos * recorregut;
                top = top + sin * recorregut;
            }

            if (AngleDireccio > 270)
            {
                left = left + cos * recorregut;
                top = top + sin * recorregut;
            }

            //Dibuixa la línia que segueix a la tortuga
            Line l = new Line();
            l.X1 = this.myTurtle.Margin.Left;
            l.Y1 = this.myTurtle.Margin.Top;
            l.X2 = (int)left;
            l.Y2 = (int)top;
            l.Stroke = Brushes.Black;
            l.StrokeThickness = 10;
            l.Fill = Brushes.Black;

            this.myCanvas.Children.Add(l);

            Console.WriteLine("Left:{0}, Top:{1}", left, top);
            this.myTurtle.Margin = new Thickness(
                (int)left, (int)top, 0, 0);


        }

        private void AngleEsquerre(int graus)
        {
            //Caldria comprovar que no surti de mare de 0 a 360.
            
            AngleDireccio = AngleDireccio - graus;
            ControlarAngle();
            lblInfo.Content = AngleDireccio.ToString();
        }

        private void AngleDret(int graus)
        {
            //Caldria comprovar que no surti de mare de 0 a 360.

            AngleDireccio = AngleDireccio + graus;
            ControlarAngle();
            lblInfo.Content = AngleDireccio.ToString();
        }

        private void ControlarAngle()
        {
            if (AngleDireccio < 0)
            {
                AngleDireccio = Math.Abs(AngleDireccio) % 360;
                AngleDireccio = 360 - AngleDireccio;
            }
            if (AngleDireccio > 360)
                AngleDireccio = AngleDireccio % 360;
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.myTurtle.Margin = new Thickness(this.myCanvas.ActualWidth / 2, 
                this.myCanvas.ActualHeight / 2, 
                0, 0);
            //Caldria restar el tamany de la tortuga.
        }
    }
}


//image.renderTransform.
//width = max(p1.x,p2.x) -left.
//height = max(p1.y,p2.y) - top.

//top = min(p1.y, p2.y)
//left = min(p1.x, p2.x);